// #include <SDL/SDL.h>
// #include <SDL/SDL_image.h>
// #include <SDL/SDL_ttf.h>
// #include <iostream>
// #include <Utils.hpp>

// enum
// {
//     CHESS_WHITE = -1,
//     CHESS_NULL,
//     CHESS_BLACK
// };
// SDL_Texture *tex_black;
// SDL_Texture *tex_white;
// int map[15 * 15];
// int x = 0;
// int y = 0;
// int down = -1;
// int player = 1;
// int myturn = 1;
// int win_draw_info[5];
// bool win = false;
// TTF_Font *font = nullptr;
// int contact_count(int player, int x, int y, int dir[2], bool reverse)
// {
//     int count = 0;
//     int rx, ry;
//     int dx = reverse ? -1 * dir[0] : dir[0];
//     int dy = reverse ? -1 * dir[1] : dir[1];
//     for (int i = 1; i < 5; i++)
//     {
//         rx = x + dx * i;
//         ry = y + dy * i;
//         if (rx < 0 || rx >= 225 || ry < 0 || ry >= 225)
//             break;
//         if (map[ry * 15 + rx] == player)
//             count++;
//         else
//         {
//             break;
//         }
//     }
//     return count;
// }
// bool check_win(int x, int y, int player)
// {
//     int dir[4][2] = {
//         0, 1,
//         1, 0,
//         1, 1,
//         1, -1};
//     for (int i = 0; i < 4; i++)
//     {
//         int left = contact_count(player, x, y, dir[i], false);
//         int right = contact_count(player, x, y, dir[i], true);
//         SDL_Log("left:%d right:%d", left, right);
//         if (left + right >= 4)
//         {
//             int win_begin_x = x + dir[i][0] * left;
//             int win_begin_y = y + dir[i][1] * left;
//             win_draw_info[0] = win_begin_y * 15 + win_begin_x;
//             win_draw_info[1] = dir[i][0] * -1;
//             win_draw_info[2] = dir[i][1] * -1;
//             win_draw_info[3] = left + right + 1;
//             win_draw_info[4] = player;
//             return true;
//         }
//     }
//     return false;
// }
// void draw_board(SDL_Renderer *render)
// {
//     const int board_size = 600;
//     const int padding = 20;
//     const int row = 15;
//     const float block_size = (board_size - 2 * padding) / (row - 1);
//     const int line_width = 3;
//     const float chess_size = block_size / 1.2;
//     const int true_size = 600 - 2 * padding;
//     SDL_FRect rect;
//     rect.h = true_size + line_width / 2;
//     rect.w = line_width;
//     rect.y = padding;
//     SDL_SetRenderDrawBlendMode(render,SDL_BLENDMODE_NONE);
//     SDL_SetRenderDrawColor(render, 0, 0, 0, 0);
//     for (int i = 0; i < row; i++)
//     {
//         rect.x = padding + i * block_size - line_width / 2;
//         SDL_RenderFillRectF(render, &rect);
//     }
//     rect.h = line_width;
//     rect.w = true_size + line_width / 2;
//     rect.x = padding;
//     SDL_SetRenderDrawColor(render, 0, 0, 0, 0);
//     for (int i = 0; i < row; i++)
//     {
//         rect.y = padding + i * block_size - line_width / 2;
//         SDL_RenderFillRectF(render, &rect);
//     }
//     const SDL_Point ps[5] = {{7, 7}, {3, 3}, {11, 11}, {3, 11}, {11, 3}};
//     const float mark_size = chess_size / 2;
//     rect.w = mark_size;
//     rect.h = mark_size;
//     SDL_SetTextureAlphaMod(tex_black, 0xff);
//     for (int i = 0; i < 5; i++)
//     {
//         rect.x = padding + ps[i].x * block_size - mark_size / 2;
//         rect.y = padding + ps[i].y * block_size - mark_size / 2;
//         SDL_RenderCopyF(render, tex_black, nullptr, &rect);
//     }
//     if (::win)
//     {
//         rect.w = block_size;
//         rect.h = block_size;
//         x = win_draw_info[0] % 15;
//         y = win_draw_info[0] / 15;
//         int dx = win_draw_info[1];
//         int dy = win_draw_info[2];
//         int count = win_draw_info[3];
//         SDL_SetRenderDrawBlendMode(render,SDL_BLENDMODE_BLEND);
//         for (int i = 0; i < count; i++)
//         {
//             rect.x = padding + (x + i * dx) * block_size - rect.w/2;
//             rect.y = padding + (y + i * dy) * block_size - rect.h/2;
//             SDL_SetRenderDrawColor(render, 0xff, 0, 0, 0xa0);
//             SDL_RenderFillRectF(render, &rect);
//         }
//     }
//     rect.w = chess_size;
//     rect.h = chess_size;
//     if (myturn && !::win && x >= 0 && x <= board_size && y >= 0 && y <= board_size)
//     {
//         x = x < padding ? padding : x;
//         x = x > true_size + padding ? true_size + padding : x;
//         y = y < padding ? padding : y;
//         y = y > true_size + padding ? true_size + padding : y;
//         int dx = (x - padding) / block_size + 0.5;
//         int dy = (y - padding) / block_size + 0.5;
//         down = dy * row + dx;
//         rect.x = padding + dx * block_size - chess_size / 2;
//         rect.y = padding + dy * block_size - chess_size / 2;
//         if (player == 1)
//         {
//             SDL_SetTextureAlphaMod(tex_black, 0xa0);
//             SDL_RenderCopyF(render, tex_black, nullptr, &rect);
//         }
//         else
//         {
//             SDL_SetTextureAlphaMod(tex_white, 0xa0);
//             SDL_RenderCopyF(render, tex_white, nullptr, &rect);
//         }
//     }
//     else
//     {
//         down = -1;
//     }
//     rect.w = chess_size;
//     rect.h = chess_size;
//     for (int i = 0; i < row * row; i++)
//     {
//         if (!map[i])
//             continue;
//         rect.x = padding + i % row * block_size - chess_size / 2;
//         rect.y = padding + i / row * block_size - chess_size / 2;
//         if (map[i] == CHESS_BLACK)
//         {
//             SDL_SetTextureAlphaMod(tex_black, 0xff);
//             SDL_RenderCopyF(render, tex_black, nullptr, &rect);
//         }
//         else if (map[i] == CHESS_WHITE)
//         {
//             SDL_SetTextureAlphaMod(tex_white, 0xff);
//             SDL_RenderCopyF(render, tex_white, nullptr, &rect);
//         }
//     }
// }
// int main2()
// {
//     int server = 0;
//     std::cout << "server?:";
//     std::cin >> server;
//     if(!Utils::initSDL()){
//         SDL_Log("SDL 初始化失败");
//         Utils::quitSDL();
//         return 0;
//     }
//     if (!(font = TTF_OpenFont("resources/msyh.ttc", 20)))
//     {
//         SDL_Log("字体加载失败");
//         return 0;
//     }
//     memset(map, 0, sizeof(int) * 15 * 15);
//     const int win_width = 800;
//     const int win_height = 600;
//     const int row = 15;
//     const int board_width = 600;
//     SDL_Window *win = SDL_CreateWindow("Gobang", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, win_width, win_height, SDL_WINDOW_SHOWN);
//     SDL_Renderer *render = SDL_CreateRenderer(win, -1, 0);
//     SDL_Event e;
//     SDL_Surface *img = IMG_Load("resources/black.png");
//     if (!img)
//     {
//         SDL_Log("IMG_Load failed");
//     }
//     tex_black = SDL_CreateTextureFromSurface(render, img);
//     img = IMG_Load("resources/white.png");
//     if (!img)
//     {
//         SDL_Log("IMG_Load failed");
//     }
//     tex_white = SDL_CreateTextureFromSurface(render, img);
//     while (1)
//     {
//         if (SDL_PollEvent(&e))
//         {
//             if (e.type == SDL_QUIT)
//             {
//                 break;
//             }
//             else if (e.type == SDL_MOUSEMOTION)
//             {
//                 x = e.motion.x;
//                 y = e.motion.y;
//             }
//             else if (!::win && e.type == SDL_MOUSEBUTTONDOWN && e.button.button == SDL_BUTTON_LEFT)
//             {
//                 if (down != -1 && map[down] == 0)
//                 {
//                     map[down] = player;
//                     myturn = 1;

//                     if (check_win(down % 15, down / 15, player))
//                     {
//                         ::win = true;
//                         SDL_Log("{%d,%d,%d,%d,%d}", win_draw_info[0], win_draw_info[1], win_draw_info[2], win_draw_info[3], win_draw_info[4]);
//                         SDL_Rect rc;
//                         rc.x = 0;
//                         rc.y = 0;
//                         SDL_Color color = {0xff, 0, 0, 0};
//                         std::string text = (player == 1 ? "黑棋" : "白棋");
//                         TTF_SizeText(font, text.c_str(), &rc.w, &rc.h);
//                         SDL_Surface *sur_text = TTF_RenderText_Blended(font, text.c_str(), color);
//                         SDL_Texture *tex_text = SDL_CreateTextureFromSurface(render, sur_text);
//                         SDL_RenderCopy(render, tex_text, nullptr, &rc);
//                         SDL_DestroyTexture(tex_text);
//                     }
//                     player = -player;
//                 }
//             }
//         }
//         SDL_SetRenderDrawColor(render, 0xf6, 0xce, 0x96, 0);
//         SDL_RenderFillRect(render, nullptr);
//         // board
//         draw_board(render);
//         SDL_RenderPresent(render);
//     }
//     SDL_DestroyTexture(tex_black);
//     SDL_DestroyTexture(tex_white);
//     TTF_CloseFont(font);
//     SDL_DestroyWindow(win);
//     Utils::quitSDL();
//     return 0;
// }